I do a lot of complex setups using Kontakt, and while in other DAWs I often use multitimbral Kontakt instances, in MainStage, I usually use a separate channel strip for every different midi channel. I set all the patches inside of each Kontakt instance to omni (there's a setting to do this by default), but then I use MS to route specific midi channels to certain inputs.
Here's how I set it up: instead of using a layout with the default "Keyboard" input controller, I create a number of "MIDI Activity" controllers*. These do essentially the same thing, but they take almost no screen real-estate so you can have any number of them. You then name them something like "Channel 1", "Channel 2", etc, and then set them to receive from that corresponding midi channel. Now that you've defined your new layout, each time you create a new patch, you can simply set the input of all your Channel Strips, to one of the MIDI routers you created, in the "Keyboard" dropdown, under the "MIDI Input" tab.
A Kontakt instance, with no patches loaded, in of itself, takes up very little RAM or CPU, so don't worry about trying to stuff a bunch of sounds into a single one. Keeping them in separate channel strips adds a lot of flexibility.
I hope this isn't too confusing and is helpful. Honestly, it completely changed my world when I started using multiple "MIDI Activity" controllers, you can create far more complex setups this way. And once you get used to it, it's just as fast as the workflow the program tends to default to.
* If you're worried about region splits (since the "MIDI Activity" controller doesn't display them), you can still set them up in the "Layer Editor" tab.