How are your frames declared? I can only guess from the context how the parts you don't show are written. That is why it helps if you can provide your entire sketch. Less guessing so less guessing wrong.
It should be the other way around:
for (byte frame = 0; frame < sizeof(Xitems) / sizeof(Xitems[0]); frame++)
{
for (int i = 0; i < NUM_LEDS; i++)
{
leds[i] = pgm_read_dword(&(Xitems[frame][I]));
}
}
That way it does every pixel of each frame rather than one pixel of every frame for each pixel in turn.