Do pointer casts maintain alignment properties?

Your structure should have an exotic alignment: it should be 16 bit aligned but not 32 aligned. Mathematically speaking, its address should be of the form 32*n+16, with n an integer.

This is forbidden by the language, a 32 bit alignment should satisfy a 16 bit alignment. Said differently any 16bit aligned structure should fit in a 32 bit aligned storage region, but your 16bit aligned structure don't. See [basic.align]/5:

Alignments have an order from weaker to stronger or stricter alignments. Stricter alignments have larger alignment values. An address that satisfies an alignment requirement also satisfies any weaker valid alignment requirement.