Что касается ошибки, которую вы получаете, это означает, что вы пытаетесь изменить данные текстуры, пока они все еще привязаны к одному из блоков сэмплера на устройстве. Вы вызываете SetData внутри блока SpriteBatch.Begin / End? Если это так, проблема в этом (обновите текстуру перед тем, как начать рисовать). В противном случае вы устанавливаете свою текстуру непосредственно в один из сэмплеров текстуры устройства, с GraphicsDevice.Textures [x] = yourTexture? Если это так, установите Textures [x] в null, прежде чем начинать изменять данные.
Что касается эффективности того, что вы делаете, это не идеально, но, вероятно, это не имеет значения для ваших целей. Постарайтесь сохранить разумное разрешение изображения и поймите, что при таком подходе вы, вероятно, не достигнете 200 кадров в секунду, но я попробую и посмотрю, достаточно ли это быстро, прежде чем вы начнете беспокоиться о производительности.