Must a Block contain a coinbase transaction? Must a block contain a coinbase transaction? If so, how is this enforced?
Yes, it must.

Block without coinbase transaction will be rejected by network.

From the Protocol, rule #6:


  First transaction must be coinbase (i.e. only 1 input, with hash=0, n=-1), the rest must not be