In your code colors is declared as
rgb_color colors[ledCount];
This means that the very first iteration of this cycle in shiftLED
for (uint16_t i = ledCount; i > 0; i--)
{
// access colors[i]
}
will access ledCount[ledCount] which is obviously out of bounds (and will actually write into that location!). The behavior is undefined after that.
Using unsigned types for "backward" array iteration requires a bit of skill. The common idioms are
for (uint16_t i = ledCount; i > 0;)
{
--i; // do this ASAP
// access colors[i]
}
or
for (uint16_t i = ledCount; i-- > 0;)
{
// access colors[i]
}
or
// Careful: this technique is not usable with unsigned types
// narrower than `unsigned int`
for (uint16_t i = ledCount - 1; i != -1; --i)
{
// access colors[i]
}
This is assuming that you want to iterate over the whole array: from [ledCount - 1] all the way back to [0].
But if you intended to iterate back to [1] and stop short of [0] (which is apparently the case), then a simple fix for your cycle would be
for (uint16_t i = ledCount - 1; i > 0; i--)
{
// access colors[i]
}
I.e. simply start from ledCount - 1, not from ledCount.