Shimming is hard, no matter how you do it, so there's that...
Tempco is the hardest thing you'll have to deal with. Permanent magnets have a pretty good negative tempco, and may not be reproducible (i.e., exhibit hysteresis). Which means your center frequency is always changing, and if it's changing significantly (<1ppm!) during an acquisition alone, you're kind of screwed, as far as getting good data.
Temperature regulation helps, obviously! But any residual (convection, drafts?) manifests as 1/f noise, which is hard to deal with.
The first ones, I think, were electromagnet because it's easier to control, and more stable(!), thanks to a nice large lead-acid battery. The original articles by Purcell and Pound spoke of controlling the magnetic field by varying the position of the window (no doubt actuated by a grad student
).
FYI, it might be tempting to regulate magnetic field with feedback -- that's a good idea too, but mind its limitations. If your field sensor is quite noisy (as is the case of a cheap Hall effect sensor!), your results will only be worse. Perhaps considerably so!
It would be nice to have a sample of a pure substance, usually H2O (? ppm) or TMS (0 ppm, by convention), and do a PLL servo using that as the field sensor and frequency standard. But that's tricky because the sensor has to be in the same place as your sample, physically speaking, and the extra reference signal probably means a poor SNR against whatever your test sample is. Producing, and shimming, a larger volume of magnetic field, is quite energy intensive, too.
Mind that your solution doesn't need to be exclusively one or the other. You could use permanent magnets for the bulk of the field (a Halbach array at, say, 1-2T), and put electromagnets around it to tweak the XYZ fields (using perpendicular Helmholtz coils), and their gradients (by applying differential current to the Helmholtz coil pairs). This definitely saves DC power!
Tim