What do you mean with irrlicht is "good for shaders modification and upgrade"? Actually Irrlicht doesn't support VBOs at all. Derivates like Irrspintz do support it, but their support is nowhere near as flexible as Ogre's implementation. E.g you still don't have a free vertex format, but still only the three fixed types irrlicht provides. And extending the engine is possible for both too obviously, as they are both free open source software. But my experience is, that you don't have to with Ogre most of the time.
I found shader usage in Irrlicht a bit of a hassle, as Irrlicht doesn't have auto_params/tweakables. When you change the shader input, you also have to change your C++ code and recompile. You need to define a callback for each type of custom shader, in order to feed needed params like world matrix, light positions etc. Ogre can do this automatically for you.
But be aware that while Ogre can do this automatically, you can still do it on your own. You can even have per renderable(ISceneNode in irrlicht-speak) parameters which is not possible in irrlicht, because the shader callback doesn't tell you what object it is about to render.
As to your 12 lights example you are free to use as many lights per pass as you can handle per pass. You don't need to take them three at a time, use more if you have enough operations in your shader left.
With Irrlicht you can only have 8 lights globally, btw.