Your code is correct. Unfortunately you can't place the ChartShape objects using PhysicalCoordinates in a time based coordinate system. Because the ChartShape objects are run through the .Net Graphics Transform function for scale, rotate and translate, and that routine (not ours) for reasons known only known to Microsoft, uses the float numeric type for calculations. But our TimeCoordinates scale requires the precision of the double numeric type. So the .Net Transform function truncates the calculations so much they are no longer useable in our TimeCoordinates. In your case the solution is simpler than using a ChartShape object. Instead, just use one of our SimpleBarPlot objects. It can display one or more rectangles exactly as you require. Because it is not run through the .Net Transform function, it maintains full double precision. See the replacement code below:
private void AddRegion()
{
Color alphaColor = Color.FromArgb(127, 170, 100, 50);
ChartAttribute attribRegion = new ChartAttribute(alphaColor, 1, DashStyle.Solid, alphaColor);
attribRegion.SetFillFlag(true);
double starttime = pTransform1.ScaleStartX + 5000; // start 5 seconds into the timeline
double tenSeconds = 10 * 1000;
double [] xx = {starttime};
double [] yy = {10};
SimpleDataset Dataset1 = new SimpleDataset("One Bar", xx, yy);
ChartAttribute attrib1 = new ChartAttribute(alphaColor, 0, DashStyle.Solid, alphaColor);
SimpleBarPlot thePlot1 = new SimpleBarPlot(pTransform1, Dataset1, tenSeconds, pTransform1.ScaleStartY,
attrib1, ChartObj.JUSTIFY_MIN);
this.AddChartObject(thePlot1);
}