OK, you're correct Syn doesn't do that correctly, and I can guess why -- the browser can't tell your keyboard layout (see here: detect keyboard layout with javascript) so it really can't tell what you should get for Shift+1, so it just gives you a '1'.
You would assume that
Syn.type('[shift]![shift-up]', 'textInput2');
Would work as expected but that doesn't either ... I think that's a bug in Syn.
So, can you do it in raw JavaScript? I can get close.
Apparently it's pretty hard to get it working cross-browser and this led me down a rabbit-hole of trying different things. First I looked at this question: Is it possible to simulate key press events programmatically? but that didn't work correctly in chrome, then I tried various combinations of events and values based on their documentation without much more success. Then I found this question: Firing a keyboard event on Chrome which led me to this code.
Pasting that code into the JS and then calling it with:
var e = crossBrowser_initKeyboardEvent("keypress", {"key": 1, "char": "!", shiftKey: true})
document.getElementById('textInput2').dispatchEvent(e);
Will give the output you expect. However, it doesn't actually write the value into the input box. Of course you could fake that and just add the text there as well, I'm not sure if that's a limitation in the way events work or if there's just something wrong with the code. Of course, for test, that might be all you need.
Here's the fiddle, maybe someone else can make the final jump.