I managed to sort out a workaround. I found some micro test probes I forgot I had, and placing the hooks of those on the shunt resistor's leads gives me a proper reading (despite the wires attached to the probes being about 1ft long).
You know, I think you're right about it being crappy contacts on the breadboard. I took just the shunt resistor and connected a jumper lead in an adjacent hole to each lead (so that everything is in series). I then measured the resistance of the entire chain, from the loose end of one wire to the loose end of the other. I initially found it to be around 3R, but found that nudging the resistor even slightly caused the measured value to vary wildly - all the way from 0R6 to 10R!
It doesn't actually
feel loose though, and there is significant friction when trying to pull it out of the holes, so I can't imagine how it's failing to make proper contact. The leads of the resistor are perfect, no oxidation at all.
Thing is, I swear I was doing a similar circuit (with the very same shunt resistor even) just a week or so ago with this breadboard, and I had no problems. Oh well. Maybe I shouldn't be buying my breadboards from eBay...