If you do not care about transient response behavior and loop bandwidth, then you may even use those overpriced high-side sense amplifiers - but I do not see a single reason for them. Noone is using them in DC loads (for good reasons).
I love how you call them overpriced
you clearly haven't used any chips over 2$ in any projects. some voltage refrences or even resistors can easily cost more than 10$ depending on the application. most commercial products use much more expensive differential amplifiers like I mentioned above, costing more than 5$
for example the schematic provided by john for the BK 8500. it uses the LT1013 which is about 6.6GBP from mouser
the *over priced* INA series are actually cheaper alternatives with less accuracy, but still good enough for this application
here is a much better version of the design:
https://easyeda.com/theepicn008/electronic-load-improved-I switched over to low side sensing (100mV/A). that is quite good but I would personally add some extra parts to improve the accuracy in the mA range. it would be a bit more complicated and you mentioned keeping things simple so I didn't do it. it requires a fet and another resistor in the feedback path of U5 to adjust the gain from x10 to x100.
-voltage sense circuit got a few improvements
-accuracy is improved by at least a factor of 10 due to much better op amps (2uV maximum offset!)
-some general clean up of the schematic
Some notes:
I changed the name of the nets: IO0 to IO3 are connected to the ADC (actually there is no IO3, I replaced it with the setpoint). DAC output is IO4.
External input / input switch had the 1k resistor in the wrong place.
I switched to 1206 for the most part. change them back to axial if you want to use those.
You don't need sil pads between the fets and the heat sink, since their drains are electrically connected anyways. if you are connecting other things such as voltage regulators, etc. be sure to use sil pads for those.
The IXYS fets would be fine, you don't have to use logic level fets. the IXTH75N15 can pass about 10A with a Vgs of 5V at around 2V Vds. it seems like a reasonable part if you can keep the case cold enough. they only specify it for case temp of 25c so I'm not sure about derating at higher temps.
with the parts you have, I'm not sure you could have gotten down to 1mA accuracy (not even 1mA resolution). It's because of your dac. with a 5V input, the resolution is about 1.2mV, which means a resolution of 1.2mA for your load 2*(0.0012mv /4)/0.5\$\Omega\$ . that is also assuming the DAC is perfect, which it's not.it has +-2 LSB INL and some DNL (I forgot sorry) which means you can be off by 4 codes, which is 4x1.2mA = almost 5mA. I think that's still reasonable for you, but let me know if you want to improve that.
this time I will be called out by Yansi for *My bullshit* and for *Use of overpriced op amps*
... again, I'm not paid by maxim to promote their chips. you can easily buy the max chips from RS (don't use ebay for parts ... they are often clones or salvaged parts, hence the cheap prices). here is an screenshot in case I'm lying about the prices again
also for resistors, There are some smallish 15 watt resistors that would be perfect for this application:
500m\$\Omega\$ 15 watt:https://uk.rs-online.com/web/p/panel-mount-fixed-resistors/0159714/
1\$\Omega\$ 15 watt:https://uk.rs-online.com/web/p/panel-mount-fixed-resistors/7547676/
I would personally go with the 500m\$\Omega\$ since it ends up being cheaper.
This is as simple as I could make the circuit without adding any special features. let me know if its still too complex or if you want additional features such as multiple current ranges etc.