The WSDL really is there just to help define the method names and params, and to mask all the HTTP headers for you, the developer.
Sounds like you're wanting to supply the method name and params at runtime. Perhaps a way around this is to completely forget about the WSDL altogether. Make your own HTTP calls.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
"http://foo.com/Some.asmx"); //build string from .config instead.
//here Register is the name of the method. take yours from config as well if needed
req.Headers.Add("SOAPAction", "\"http://tempuri.org/Register\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
See the article Invoking Web Service dynamically using HttpWebRequest for full details.
The thing about .NET's web service wrapper classes in general, is that they're trying to help enforce the server's contracts with the client. Obviously you're trying to avoid changing the statically typed clients, as presented by the .NET wrapper classes. Hopefully it won't be too onerous for you to maintain.