Marsu --
I'm new here, but here's my understanding from the code. The difficulty here is that the firing is done within the 3d engine -- while this may look like a board game, the game internals are a full 3D game (a modification of Quake2). That means that bullets and lines of sight connect specific 3space points to one another.
So "shooting over" something actually means raising the origin point of the shot -- but only if there's a shoot-overable object in front. That in turn means a new model animation (to raise the gun high enough to get over the object in front), new map properties (to contain the "is X shoot-overable" information), and so forth. Worse, in order to calculate cover and visibility the game performs some basic ray-traces from the gun to various points on the target. So to add shoot-over trajectories would require doing calculations from both the lower and higher firing positions. That means not merely double the calculations on every move of the mouse during aiming, but also double the calculations for, eg, aliens trying to determine if they're safely covered, reaction-fire checks, and so forth. Add in crouching, and there's just a whole lot of trouble here.
It's a sensible and in some ways desirable feature, but may be (like the ever-popular destructible terrain) simply be beyond what's practical with the code we have. Still, definitely one to keep in mind going forward -- I think most of us at one point or another have tried to fire a rocket from behind cover and blown ourselves up.
If you do decide to look into the problem (or just poke around in the code for fun), the place to start is in src/game/g_combat.c -- the argument "at" to various functions is the location of the gun muzzle -- and the G_ActorVis function in src/game/g_client.c.