I got tangled up with this same idea some time ago and posted a lot of incorrect stuff about it in this very newsgroup.
I think the tricky aspect is that language is very slippery. Meanings change and multiply in a flash in a way that is difficult for us to keep track of. Take the string (let's call it String Q), "The antidiagonal of the list of all real numbers derived from an alphabetical examination of all finite strings". This string does not specify a real number when we are attempting to build our list, but it can be taken to specify a real number after our list is built.
This shift in meaning is what creates the paradoxical effect. Under the following assumptions the "paradox" disappears. (1) Any given string either specifies a real number or does not. (2) No string specifies more than one real number. (3) No string changes in meaning.
Under these assumptions String Q causes us no trouble. If String Q does not specify a real number when we are building the list, String Q also does not specify a real number after our list is built. If String Q specifies a real number when we are building the list, then that number is included in the list and - despite how we might protest later - String Q cannot, therefore, actually specify the antidiagonal of our completed list.
So under these assumptions the real numbers specifiable by finite strings are denumerable. And there is no Cantorian argument to show otherwise because the antidiagonal of any list of these numbers cannot be specified by a finite string (such as String Q) - as surprising as that fact at first seems.