I think it might be possible via nwnx. (specifically nwnx_cool or events)
int (__fastcall *CNWSCreature__AddCastSpellActionsNext)( CNWSCreature * cre, void *, unsigned long nSpell, int arg2, int arg3, int metamagic, int arg5, Vector vTarget ,nwn_objid_t arg6, int arg7, int arg8, int arg9, unsigned char arg10, int arg11, int arg12, int arg13, unsigned char arg14 );
nwnx_cool already hooks this function - which gets fired when you create the action to cast a spell.
In theory - if I hooked at this point, I could get the target,
Do the Cone/GetObjectInShape call - ascertain if there is a shield in the way.
If so - bypass (cancel the spell cast)
Add new Action to the ActionQueue in its place,with the new target.
Because the nwnx call/action cancelation would probably result in the action not have been added to the queue in the first place, it shouldnt affect combat rounds either.
eg: Although I say 'bypass/cancel' the cast event, its actually just stopping it from being created.
This means when the nwnscript takes over, and casts the spell in its stead - it should be just like the target I had selected, was actually the wall/barrier itself, and hopfully there shouldnt be anything suggesting that it had cancelled an action previously.
Although, this is all theoretical at the moment,
Implimentation will be trial and error.