Creating proxy on the fly is very easy. But one thing to keep in mind is, we need to have copy of the Service Contract and the DataContracts in the client application. So that, we can call the service and get the result back. If you choose the Operation Contracts to reture data in string or xml or some onther common format, then the client application should take care of reading data from the result.
To answer your question, creating proxy from the code can be donw using ChannelFactory for normal binding. If you use duplex binding, then you may want to use DuplexChannelFactory.
Below is the sample code
class Program
{
static void Main(string[] args)
{
var channel = new ChannelFactory<ICalcServices>(new WSHttpBinding(), new EndpointAddress("http://localhost:8000/CalcServices"));
var proxy = channel.CreateChannel();
Console.WriteLine(proxy.Add(1, 2));
Console.WriteLine(proxy.Sub(2, 1));
Console.Read();
}
}