partA = static_cast<uint8_t>((color &0xFF00) >> 8); // == 0 всегда
partB = static_cast<uint8_t>(color &0x00FF); // 0..255
за 1024 точки partB 4 раза проходит от 0 до 255 - по-этому вы видите 4 градиента.
вы неправильно создаете его
16 бит grayscale - значит, значение тона меняется от 0..65535, вам необходимо "сжать" этот диапазон в 1024 точки то есть каждая точка в горизонтали должна заполняться как-то так:
for (ushort color = 0; color < 1024; color++)
arr->append (color * 64); // * 65536/1024
таким образом каждая точка будет увеличиваться на нужный шаг. если хотите сделать "челлендж" своему монитору, то вам нужно не весь ряд отобразить, а отобразить именно 10-20 тонов, тогда вам нужно "разжать" 10-20 тонов на 1024 точки - тут вы уже справитесь, я думаю.