OK. I have done loads more testing in live mode (my poor credit card ) as Sandbox environment kept coming up with errors and timing out. This is what I have found:

If I check out with a shipping address that is different from my PayPal account address, the address from my PayPal account is written to the database with the order details as the shipping address. This part I knew already. The interesting part is that once the transaction is complete there is a new entry in my address list with the PayPal account details.

This means that ZenCart is allowing the PayPal address sent back to override what the user sets as the shipping address during checkout. This does not seem right. The other interesting thing I noticed is that if you already have 5 entries in your address book, using PayPal Express as the payment method allows you to go over the 5 address limit I ended up with about 8 entries in my address book when in Zen Admin I have it set to only allow 5 max.

Now I will start looking at how to get ZenCart to ignore the address that PayPal sends back and write the address that the user has specified to the database as the shipping address.