You haven´t done anything wrong, rather, you have discovered a bug!
The correct position of left edge of the rectangle representing the data item is dependent on a number of factors, such as the bar width, the number of visible series, item and category margins of the renderer and the CategoryAxis and on the availabe space. The calculation of the correct position is thus not trivial.
The IntervalBarRenderer uses an algorithm that does not use the various parameters in a correct way. Fortunately, the BarRenderer does, and the BarRenderer even has a protected method to calculate that value!
In IntervalBarRenderer.drawInterval, the section where rectY is calculated for a horizontal plot orientation (lines 213 to 222) needs to be replaced with:
rectY = calculateBarW0(plot, orientation, dataArea, domainAxis, state, row, column);
and the section where rectX is calculated for a vertical orientation (lines 232 to 242) needs to be replaced with
rectX = calculateBarW0(plot, orientation, dataArea, domainAxis, state, row, column);