#2 has the problem that it's unreliable, and a little slower than option #3. It's unreliable because it's really a macro, which is kind of silly to use when the SSH protocol has the ability to pass the username in during initialization. Also, the way that PuttyCM's macros are implemented, is that it doesn't even WAIT for the connection to be made before it starts sending keystrokes; this means that even the login name can be lost if you get the timing incorrect.
#3 is the one I prefer to use.
Note that you can use both #1 and #3, and in this case, #3 will override #1. You can therefore use #1 for your most common username, and then use #3 for all exceptions.