Hmmm. Well, I've found out several things. First off, the flags don't seem to do what I thought. They just deterime the collision model tested against, but they don't generate the hit facing.
What is interesting is that all that I needed to do was change the final number in line 2788 of code/Weapon/Beam.cpp from -1 to any other number corresponding to a shield face (1-6 or 0-5, I believe):
ship_apply_local_damage(&Objects[target], &Objects[b->objnum], &b->f_collisions[idx].cinfo.hit_point_world, beam_get_ship_damage(b, &Objects[target]),
-1);
Then, the target takes damage to #2 (or whatever number you choose) shield every time it is hit, until the shield drops. Then it takes damage to the hull, etc., as usual. The only trick now is to figure out what the correct code is that represents the shield facing hit.
Unfortunately, the beam functions use a radically different code structure than the other weapon functions, so cutting-and-pasting doesn't work (and believe me, I've tried!)...
More later (when my brain stops hurting)...