The build will only run on a runner that has that specific label.
This is the expected behavior, per the documentation
A pipeline is not routed to a runner unless it matches all runner labels. If the pipeline only defines and matches a subset of runner labels it will not be routed to the runner.
Second, is there a way to get a job to run different steps on different runners?
No. Drone is architected in such a way that runners are meant to be treated as pools of shared resources where a pipeline can run on any node in the pool. Drone is not architected to allow routing pipelines to individual nodes. Drone treats runners are cattle, not pets. If you are trying to route pipeline to individual named runners you are treating your runners like pets, which would be considered an anti-pattern.
I hesitate to make generalizations, but this question is most frequently asked when someone wants to execute a deployment step. It is my understanding in the Jenkins world, it was common practice to install a Jenkins agent on your production machine to facilitate deployment to that machine. In the Drone world, the recommended approach is to architect remote deployment (ie using ssh, sftp plugins, etc), so that you can deploy from any machine in your Drone cluster.