There is no way to do this automatically with CNiGraph. You should be able to do it manually, but it will require some work. The best way I can think to do this would be to create an array of CNiReal64Matrix instances. Each instance in the array corresponds to one of the plots that you have now. When a new data point is available, add it to the appropriate CNiReal64Matrix instance (instead of calling ChartXY). Then, call CNiPlot::PlotXY and pass it the CNiReal64Matrix instance that contains the data. You could keep a running count of the total number of points that are in all of the CNiReal64Matrix instances in the array. When you reach the total number of annotations that you have, you will have to shift the data in one of the matrices. Unfortunately, there is not an easy way to do this with CNiMatrix alone. When it is time to shift the data, the easiest way I see to do it would be to call CNiMatrixT<>::CopyRow to extract CNiReal64Vector instances for each row in the matrix, call CNiVectorT<>::SubSet to shift the data, and call CNiMatrixT<>::AssignRow to put the data back into the matrix, and then plot.
Will this approach work for you?