Solved! (for me anyway)
I had this exact same problem on my new iPhone 3gs (found this forum by Googling my issue). Turns out I had lots of duplicate entries because my contact list had pulled from a variety of places when I synced (Exchange Contacts, Local Outlook Contacts, an Outlook Archive of Contacts) and even though I was only viewing my Exchange Contacts, the caller ID was picking up the data entry for the local Outlook contacts. I know I could go in and clean up my disaster of a contact list, but here was the easy solution.
- Have the person who's ringtone you want to customize call you.
- Then go into Recents in the Phone app.
- Click the blue arrow next to their entry in recents
- You will now be looking at the Contact entry that your iPhone decides to associate with the caller, not necessarily the one you are set to be viewing by default in Contacts.
- Check the custom Ringtone in that entry - if it is still listed as Default then you probably have a duplicate entry problem like I did.
- You can either clean up the duplicate entry problem or just change the Ringtone here to the custom ringtone you want and then try again.
Hope this helps.