Monotone cubic interpolation
Don't throw Exception


throw new Exception("Need an equal count of xs and ys");



It forces client code to catch any subclass of Exception. In this case I would throw an ArgumentException.



The continue at the end of the last loop is redundant.



Here you're using double.Equals

if (delta[i] == 0)


From MSDN


  The Equals method should be used with caution, because two apparently
  equivalent values can be unequal due to the differing precision of the
  two values.


That link covers two techniques for dealing with this.



As far as I can tell, toFix can be removed. For example,


var toFix = new List&lt;int&gt;();
for (int i = 1; i &lt; length - 1; i++)
{
    if ((delta[i] &gt; 0 &amp;&amp; delta[i - 1] &lt; 0) || (delta[i] &lt; 0 &amp;&amp; delta[i - 1] &gt; 0))
    {
        toFix.Add(i);
    }
}
foreach (var val in toFix)
{
    m[val] = 0;
}



Can be rewritten as

for (int i = 1; i &lt; length - 1; i++)
{
    if ((delta[i] &gt; 0 &amp;&amp; delta[i - 1] &lt; 0) || (delta[i] &lt; 0 &amp;&amp; delta[i - 1] &gt; 0))
    {
        m[i] = 0;
    }
}