I think you described things pretty well.
The incoming packets that are in reply to something you initiated will have your LAN address.
Packets originating from outside do not have your LAN address, but have a port number (default 80). You, using port forwarding (or virtual server), have told the router to which LAN address that port should go.
I don't know a good source for all the detail you want. In addition to searching for Network Address Translation and Port Address Translation, you can also get details about packet structure at the different levels by looking into Transaction Control Protocol/Internet Protocol (TCP/IP).
If this has answered sufficiently please mark 'solved' using the Thread Tools at the upper right.