Try to verify that mIRC itself is sending the right port with /debug @debug
Some routers have been reported to change the port in dcc messages (to allow them to set up temporary forwarding), however even if the port were changed, the router should still be forwarding back to your local port when your friend connects, which doesn't seem to be the case. I'm not sure if this behaviour can be disabled (maybe a silly hidden option somewhere around UPnP settings).
If you have the resources, you could try reproduce the problem without your router, or setup a local IRC server and send dcc requests between two local clients.
Hope that helps
[edit: btw if your friend is using
ctcp 1:*:*:$1- in his remotes he's in for a rude shock. :P]