When looking at your measurements, it is clear that in the ranges up to 200mA the output current always seems to be some 2.7 ~ 3.7mA too low, for the 1xx setpoint. How is it at different setpoints? Is the error constant or proportional?
Anyway, we have some strong hints, as the voltage over the shunt resistors appears correct, but the output current is too low by either a pretty constant current or a constant percentage of the setpoint (please check what is actually applying here) regardless of the range. Okay, it looks a bit different for the ranges 500mA and above, but not by much, as it essentially just seems to be twice the current compared to the lower ranges. The difference is, you have fully exploited these higher ranges, whereas you only used 50% of the lower ranges, so this is a hint that the error is actually proportional to the setpoint, i.e. some percentage of it, but still totally independent of the range.
Now we should try hard to find a hypothesis how something like this could happen…
The first conclusion is that it has something to do with the voltage, as this is the only constant across the ranges. Since the voltage across the shunt appears correct, it most likely equals the setpoint voltage 0 ~ 200mV. No wonder you couldn’t find anything wrong in this area.
The errors can only be explained by some additional voltage across the shunt, NOT caused by the output current. It has to be an extra current from somewhere. Look at the picture below:
This is a basic current source. V4 is the reference voltage for the setpoint and goes from 0 to 200mV. R1 is the external load, R2 is the shunt resistor (for 2mA range).
The interesting part is R3, which sends some extra current through the shunt, which is then missing at the output of course. The graph to the right illustrates this.
It is actually two graphs, which happen to appear as just one, but there are two different vertical scales.
1. The voltage across the shunt resistor vs. setpoint voltage. Both go from 0 to 200mV – exactly what you see in your device.
2. The current through the external load. It goes from -3.4mA to -1.4mA and is -2.4mA at the 100mV setpoint – again exactly what you see.
To verify this, just don’t connect any load and measure the voltage drop across the shunt again – if it equals some 3mA multiplied with the shunt resistance, then my theory is confirmed.
Since the error is about the same for all ranges, there is no need to look for a problem near the shunt resistors, rather behind the switches at the input of the OpAmp.
It could be a defect of the OpAmp input.
If there’s an analog multiplexer used for range selection, this could be faulty.
Of course it could also be just dirt and moisture forming a resistor from the positive supply rail to the inverting OpAmp input, but I take it you would have noticed that by visual inspection already…
EDIT: Sorry, the above circuit and graphs illustrate the case of a constant current error.
For the more likely proportional error, the parasitic resistor goes from the output of the current source (the OpAmp in my example circuit) to the shunt and obviously has to be quite a bit lower in value.
In this case, the error will depend on the load resistor and you'll see no voltage drop across the shunt with no load connected.
EDIT2: From your measurements, the proportional case would be even more tricky than that, since you even get negative output currents. But before I go on speculating, I'll wait what you find out and if it's actually a proportional error.