I don't understand why it has three names to refer to the same file. (Icon, Icon?, Icon^M)
But that's ok.
There's only one name. It's just being displayed by three different programs.
^M means control-M. Which is CR (Carriage Return). See any ASCII code table.
The program that only shows
Icon is probably just outputting the string directly. Which would result in a CR being output. Which may have no consequences, or may simply add a blank line to the output.
The program that shows
Icon? is probably a result of a Terminal setting that translates all non-displayables (which includes ctrl-chars) to '?'. You could name a file ESC-C (where ESC is the actual ASCII ESC character, 0x1B), and the ESC character would appear as '?' in Terminal. It's usually difficult to type such chars in Terminal, but not impossible.
The program showing
Icon^M is clearly performing a translation of ctrl-chars to visible representation.
If you recall, my first reply said the icon was stored in ".Icon\r". I clearly misremembered the leading dot. However, the "\r" was absolutely intended to mean the ASCII CR characters, 0x0D, whose C-style escape is \r, and where the shell can also sometimes be induced to accept as \r.
Regarding the LS refresh. This is a long-standing issue. A few other tricks I've used in the past:
1. Archive the app into a zip file. Delete the original app. Unarchive.
2. Move the app to another folder (even a sub-folder), then move it back.
3. Copy the app to another volume (even a disk-image volume), delete original, then copy it back.
There are also LS functions/methods to tell LS that it should take note of changes to a particular app. Or that it should scan a directory for apps it should note.