In general shader caches are compiled for the GPU hardware and driver they intend to run on, which means you can't precompile all of them if you don't know what hardware setup the software is going to run on. This isn't unique to emulators either. PC games have this same problem and either stream it in the background or hide it in loading screens.
The difference for emulators is that they don't have the benfit of source code to work from and effectively have to decompile, translate, and recompile. These steps can change each version as translation accuracy improves but ultimately means starting over with a blank cache. For simpler consoles before unified shader pipelines, this isn't much of an issue because there are a fixed number of render methods.
In summary, you can really only share caches if the GPU, driver, and version are all the same. Otherwise the emulator will invalidate and recompile the cache.