Consistent way to handle transient timeouts with WCF calls (timeouts, unreliable network, server load, etc)
One clean up is to consolidate the common code in the catch blocks, by putting it into a function. Other ideas:


5 tries is not many for WCF in general. I would increase it to 50 or so. If you do this, you need a ceiling to multiple applied to to the minimum sleep time.
The milliseconds to sleep should be initialized to a semi-random value: a minimum value, plus a random fraction of an additional amount. Usually I make the additional amount equal to the minimum value. This will keep all your clients from hammering the server with the same rhythm, in the event all clients start at the same time.


With regards to questions:


Make the method generic, with a type parameter defining the return value.
I usually have only two catch blocks, one for FaultException to communicate exceptions explicitly from server to client, and one for Exception, to catch everything else. The Exception block is where you initiate a retry. Read about FaultContractAttribute.
The only good way to allow cancellation is to run all of this in a background thread, possibly using BackgroundWorker.