There are two plugins that might help get you what you want — TopsyTurvy & ShapeShifter. One inverts the
shift behaviour for specified
Key values, the other changes the keycode produced when
shift is applied.
TopsyTurvy should be able to swap
_ easily enough.
You can certainly put a key that produces
? on some other layer, by using
LSHIFT(Key_Slash) (assuming you want to be able to type it without also holding shift). With ShapeShifter, you could get that key to produce another shifted symbol when shift is held.
Even together, however, these two plugins don’t let you assign symbols completely independently to the shifted and unshifted states of a key, so you might not be able to get the keymap that you want. (I wanted total shift-dissociation, so I wrote my own version of Kaleidoscope to get it).