Yeah, it can be done, but not easily. Currently, from what I've seen from the current source tree is that renderer functions are called via function pointers that are assigned during initialization. Instead, if we have one global abstract class (for argument's sake, we'll call that IRenderer) it can be done something like this:
IRenderer *pRenderer = 0;
switch (something)
{
case GR_OPENGL:
pRenderer = new OpenGLRenderer(constructor args);
break;
...
}
That's the easy part. Actually interfacing this with the current rendering system would be murder. In fact, if I can browse through the code and learn a bit more about the current rendering system, I can start by wrapping some of the functions into a more OO approach and slowly start to merge the current renderers into separate classes.
If I start on something this big it would either be for my own purposes or if there is really a demand for this after all. I am a bit uncomfortable with making changes of this magnitude to a working project like FS2 or FS2_open and it has already been voiced that people are worried about breakage. That's why I say this may be a bit more than everybody wants (although it could vastly simplify expansion of the graphics later on.)
Heh... Once again, I need many more opinions before I butcher the code that has taken years to create, even if the end product is 100 times more powerful.