On reflection - you're absolutely right. In fact this is exactly the way OpenGB is designed!
OpenGB uses an abstract base class (called IPrinter) to describe a printer interface. At the moment there exists a Marlin implementation and a Dummy implementation (as you describe) of IPrinter.
Other comments mention BeagleG and MachineKit. It should be pretty trivial to add IPrinter implementations of both of these.
Thanks for the inspiration! :)