Mark, If I remember correctly we had this problem one one of our clients sites and I think that the display name is not acutually set until after this email is sent; I have just checked the code and the process is:
1) user is created (Users.Create())
2) welcome email sent in the Create() method
3) profile data set and user updated (SaveAdditionalProfileData() called) - displayname set here
I would say that the best solution here would be to:
1) disable "deliver welcome message" in the control panel
2) create a csmodule which monitors the user update event
3) send a custom email from this module with the same info in as the standard one (but at this point the users display name should be set) - you need to use the new mime templates to create an email.
Hope this helps. Let me know if you need any help with this.
Alex - If I am wrong then please point Mark in the right direction instead.
Thanks
Adam