I'll answer the ones I can
2016 - Why does the difficulty adjust every 2016 blocks? Why not 2000, or 2048?
This is 2 weeks * 10 minutes / block.
2 weeks - Why does the block adjustment map to a two week period? Why not every week or everyday?
I think daily adjustments would be / have been better. Two weeks seems a bit arbitrary to me, and I see no disadvantages to making it happen more often. There isn't a low latency attack, since difficulty adjustments are tied to blocks and you can't successfully generate coins without the newest block.
10 minutes - Why do we want to generate a block every 10 minutes? Did this drive the above choices or is it a result of them?
I understand the trade off here; we're balancing speed of transaction confirmation with bandwidth usage and the risk of low latency advantage. If blocks were generated every 10 seconds, then people with a faster internet connection would have an advantage, which is against Satoshi's goal. However, if they were generated every hour, it would take at least an hour to confirm a transaction.
BitCoin Addresses - Why use the hash of a hash (good idea!) for an address, rather than simply using the full public key.
Addr = RIPEMD160( SHA256( public_key ) )
This makes addresses 160 bits long (shorter = better for usability) but also ensures that the input to the RIPEMD160 is an unpatterned 256-bit number (assuming there are no flaws in SHA256).
Certificates - Why not store public keys as part of standard 509 certificates, or in PGP format, The same for private keys.
I dunno - that's a good idea. I think there's a real advantage to being able to trade the keys independently of the Bitcoin network.