I tried the iRinger app and it failed with several ringtones. It seems to use a 7-digit naming convention, which as I noted earlier doesn't always work (though often does).
BUT, I think I have found a fairly consistent solution...
I am now using SendSong 0.17 (Experimental) from here:
http://ericasadun.com/ftp/Applications/SendSong/
This has worked for me, and it even creates the spoof .m4r file. Ringtones are still blown out after syncing, but I use a Tapp command to restore my working plist.
1. Add the appropriate ringtone (has to be a .m4a file) to your iPhone playlist in iTunes and sync. Keep the track to 30 seconds or shorter.
2. Run SendSong and send the song to ringtones.
3. Before syncing to iTunes use SSH or Mobile Finder to make a copy of /var/root/Media/iTunes_Control/iTunes/Ringtones.plist as /var/root/Media/iTunes_Control/iTunes/Ringtones.plist.OK.
4. After syncing to iTunes run Tapp with the command posted earlier in this thread. This will retain your custom ringtones.
While it still ain't perfect it beats playing the rename dance, not to mention manually editing the plist.
BTW: SendSong always names the m4a files with 4 digits, just like purchased ringtones are named. It always uses 29333 as the time integer too. It also uses random GUID strings. Here's a sample of a track converted using SendSong 0.17:
<key>MPBG.m4a</key>
<dict>
<key>Album</key>
<string></string>
<key>Album Artist</key>
<string></string>
<key>GUID</key>
<string>E41CAD1192777577</string>
<key>Name</key>
<string>Dire Straits - Walk Of Life</string>
<key>Total Time</key>
<integer>29333</integer>
</dict>
<key>MPBGDire_Straits__Walk_Of_Lifespoof.m4r</key>
<dict>
<key>Album</key>
<string></string>
<key>Album Artist</key>
<string></string>
<key>GUID</key>
<string>E41CAD1192777577</string>
<key>Name</key>
<string>Dire Straits - Walk Of Life</string>
<key>Total Time</key>
<integer>29333</integer>
</dict>
--
Mike