@espvar, 
This is an input XML: 
<root><child>nospecialchars</child><specialchild>data&data</specialchild><specialchild2>You.. & I in this beautiful world</specialchild2>data&</root>
And the Main function:
        string EncodedXML = encodeWithCDATA(XMLInput); //Calling our Custom function
        XmlDocument xdDoc = new XmlDocument();
        xdDoc.LoadXml(EncodedXML); //passed
The function encodeWithCDATA():
    private string encodeWithCDATA(string stringXML)
    {
        if (stringXML.IndexOf('&') != -1)
        {
            int indexofClosingtag = stringXML.Substring(0, stringXML.IndexOf('&')).LastIndexOf('>');
            int indexofNextOpeningtag = stringXML.Substring(indexofClosingtag).IndexOf('<');
            string CDATAsection = string.Concat("<![CDATA[", stringXML.Substring(indexofClosingtag, indexofNextOpeningtag), "]]>");
            string encodedLeftPart = string.Concat(stringXML.Substring(0, indexofClosingtag+1), CDATAsection);
            string UncodedRightPart = stringXML.Substring(indexofClosingtag+indexofNextOpeningtag);
            return (string.Concat(encodedLeftPart, encodeWithCDATA(UncodedRightPart)));
        }
        else
        {
            return (stringXML);
        }
    }
Encoded XML (ie, xdDoc.OuterXml):
<root>
  <child>nospecialchars</child>
  <specialchild>
    <![CDATA[>data&data]]>
  </specialchild>
  <specialchild2>
    <![CDATA[>You.. & I in this beautiful world]]>
  </specialchild2>
  <![CDATA[>data&]]>
</root>
All I have used is, substring, IndexOf, stringConcat and recursive function call.. Let me know if you don't understand any part of the code.
The sample XML that I have provided possess data in the parent nodes as well, which is kind of HTML property .. ex: <div>this is <b>bold</b> text</div>..  and my code takes care of encoding data outside <b> tag if they have special character ie, &..
Please note that, I have taken care of encoding '&' only and .. data cannot have chars like '<' or '>' or single-quote or double-quote..