I'm going to assume that by "high speed" you mean updating the screen with very little time between updates. In this case, it's possible that you're updating faster than the screen's refresh rate, which is about 60Hz. So, for example, if you're sending frames at 90Hz, you'll send 3 frames in the time that the display can only show 2. This likely means that one of those frames will be skipped (more realistically, parts of different frames get skipped, but the outcome is similar). Grayscale relies on having pixels on and off for the correct ratio of time, so the screen skipping some updates results in the ratio being wrong and pixels having the wrong shades.
I believe the "diagonal line thing" you're seeing is another artifact of the updates not being perfectly in sync with the screen's refresh rate and frames being mixed. You'd still have frames mixing if you just alternated sending complete buffers. But combining the buffers into a dithered image makes each individual frame appear much closer to the desired shades, to the degree that your eyes can't really tell when the refresh rate is fast enough. If you simply alternated buffers, a flashing effect would be much more apparently because your eyes can pick out large blocks of pixels alternating between black and white. And I think the screen has problems with it.
As Sorunome suggested, if you're looking for high-quality grayscale, I would definitely recommend trying GrayLib. I realize it can be a bit daunting to get into, but if you have any questions, just ask and I (or someone else) should be happy to answer.