This is probably a very stupid question and I apologise if it is. But can't you just use the D3D9 feature levels in DX11 for the D3D9 renderer ?
It's not a stupid question at all, it's definitely something developers should look into if they wish to support direct3d 9 video devices. However, there are caveats. For example, if the dev wanted to run their application on Windows XP, they couldn't use the Direct3D 11 runtime because it won't work on XP.
Also, from personal experience, the D3D9 feature levels are a pain in the ass to work with. I've had several little "gotchas" when dealing with the D3D9 feature level (some of which have no or very sparse documentation) that I've nearly given up on caring if people can use it.
An example of one of the issues I ran into was copying a texture into a staging texture. Apparently, under feature level 9 you can't copy a resource into a staging resource if the source resource is in GPU memory and it's got a shader view attached to it. So, if you created a texture with a shader view, you're out of luck. So, create one without a shader view right? Unfortunately, no, that leads to another set of issues (e.g. you can't bind to a pixel shader, kinda necessary). There was that and a few other small issues I ran into (multi monitor was especially painful).
Another issue with feature level 9 is that the highest vertex/pixel shader model supported is SM2_x. If you wanted to support SM3, then you're out of luck.
So in my own personal renderer, I want it to be able to support D3D9 and D3D11. To do this, I thought about having a master renderer interface that two classes will derive from. One will implement the D3D9 renderer and the other will implement the D3D11 renderer. However, this requires that I statically link to both D3D9 and D3D11, which will (I think) require that both dlls be present at run time. Is there any way I can avoid this?
You could design a system to load your renderer dynamically as a DLL. This way the DLL would be the only thing linking to the libraries in question, your host application/API would have the interface abstracted so it wouldn't care about the dependencies. So, for example, you can detect whether the user is running XP and force load the D3D 9 renderer DLL, or if they're not then load the D3D 11 renderer DLL.
If you put both renderers in the same DLL then yes, you'll need to link against both. Whether the end user will require D3D11 and D3D9 installed to run, I can't answer with any degree of certainty because it's been an incredibly long time since I've dealt with that stuff, but I'm going to guess that yes they would require both.