First set chart.ChartArea[0].AxisX.Minimum and chart.ChartArea[0].AxisX.Maximum.
And then chart.ChartArea[0].AxisX.Interval = 100; and also adjust the IntervalOffset.
However, if Minimum is > 0: the grid will offset from the Minimum value. Which means the correct offset will be axis.IntervalOffset = axis.Interval - axis.Minimum;
But, if Minimum is < 0:
axis.IntervalOffset = axis.Interval - axis.Minimum
will be evaluate to something like (with Minimum = -4 as example) axis.IntervalOffset = 100 - (-4) = 104 which is problematic because if IntervalOffset > Interval the interval will start at IntervalOffset and skip any gridlines between Minimum and IntervalOffset. (With above example gridline at 0 will be skipped)
In another words the correct offset is: IntervalOffset = (axis.Interval - axis.Minimum) % axis.Interval.
Which gives the correct offset:
axis.IntervalOffset = (-axis.Minimum) % axis.Interval;
For instance:
var axis = chart.ChartAreas[0].AxisX;
var points = chart.Series[0].Points;
axis.Minimum = points.Min(p => p.XValue);
axis.Maximum = points.Max(p => p.XValue);
axis.Interval = 100;
axis.IntervalOffset = (-axis.Minimum) % axis.Interval;
Will give you a grid that intersects X = 0.