<p>When I try to add a HTTP header key/value pair on a <code>WebRequest</code> object, I get the following exception:</p>

<blockquote>
  <p>This header must be modified using the appropriate property</p>
</blockquote>

<p>I've tried adding new values to the <code>Headers</code> collection by using the Add() method but I still get the same exception.</p>

<pre><code>webRequest.Headers.Add(HttpRequestHeader.Referer, "http://stackoverflow.com");
</code></pre>

<p>I can get around this by casting the WebRequest object to a HttpWebRequest and setting the properties such as <code>httpWebReq.Referer ="http://stackoverflow.com"</code>, but this only works for a handful of headers that are exposed via properties.</p>

<p>I'd like to know if there's a way to get a finer grained control over modifying headers with a request for a remote resource.</p>

WebRequest
being abstract (and since any inheriting class must override the Headers property).. which concrete WebRequest are you using ? In other words, how do you get that WebRequest object to beign with ?
ehr.. mnour answer made me realize that the error message you were getting is actually spot on: it's telling you that the header you are trying to add already exist and you should then modify its value using the appropriate property (the indexer, for instance), instead of trying to add it again. That's probably all you were looking for.
Other classes inheriting from WebRequest might have even better properties wrapping certain headers; See
this post
for instance.