Most shadow systems I have seen use a unified shader system for shadowing techniques, resulting in an uber shader for the projects.
What alternatives do you find work well or is the unified shader the best approach?
I'm assuming your question is about shadow map-based techniques.
Generally choosing uber shaders is a higher-level decision than shadows, so shadows usually follow whatever method engine uses for rendering.
For example, you might choose using deferred rendering which requires far less permutations than traditional approach, then applying shadows will be added once to the deferred light shader and rendering shadomwap will be essentially the same path that generates G-Buffers.
Another thing I think I heard people considered is to just generate shadowmaps on SPUs without any shaders.
So decide on your method for rendering the scene and use it for shadows as well.
From what I see, you have three alternatives to uber-shaders:
In the end, it depends on the specifics of your project. The bigger the project gets, the more I would steer away from hand-coded shaders or uber-shaders and pick something more modular like light pre-pass or a shader build-system. The trend is definitely going towards deferred rendering systems though.