from my perspective (others may be different)
Id say, merging all midi input is rarely what I want (and of course, output = never)... Id usually want a patch/object to be able to determine where the midi data goes. In fact, the only scenario where I don't care, is when Im developing, say a synth patch, and I just need any controller to trigger the sound. ... but honestly I don't see that so much as merging data, as not filtering any device (e.g. Omni)
but other cases, I really do want separate streams, and I need them to be identifiable...
something like a Launchpad, you may be send/receiving specific data, to say control the pad colours.
or you might want you keyboard to be triggering a synth, but a 'pad controller' to be triggering drums.
(... and I don't like generally doing this via midi channels, its cumbersome at best, and if your controller is sending out on multi channels (sequencer/multitimbral synths/expressive controllers) , it may not even be viable.)
I'm not quite sure I understand the benefit of virtual mappings much.. over say simple filtering, with Omni options..... the only advantage I can think of, is if you had lots of controllers or similar types... and you want to treat them similarly.. then you could group into a virtual midi device - but that seems pretty 'corner case'
even with virtual midi ids, your still going to need to get the 'usb device name' back to UI, so the user can identify it.... are you proposing, that the first time a 'new' device connects it gets a virtual midi id, and then has it forever? ... that might work
also, how do you propose to do output? I cant see you ever want to merge output (ok, perhaps clock is useful, but not notes/cc etc), its going to get very confusing if a physical device has a different virtual midi input id, to its output id.