Here's a Python script for GIMP that takes an indexed color image and replaces every other color with a checkerboard dithering of its neighbors. The intended use was to create grayscale 4 color images with this style of dithering, by first creating a hand-tuned 7 color image, then applying the script. After it runs, you can delete the in-between tones from the palette. It should work for any odd number of colors, n>=3.
Having scripted Gimp in both Python and Scheme, I definitely found Python more pleasant.
This is the kind of silly thing I used to do, to pass the time:

#!/usr/bin/env python
# Pixel art dither script for GIMP
# Author: ahefner@gmail.com
import math
from gimpfu import *
from array import array
def python_8bit_dither(img, srclayer):
try:
pdb.gimp_message("Running...")
pdb.gimp_image_undo_group_start(img)
layer = srclayer.copy()
img.add_layer(layer, 0)
width = layer.width
height = layer.height
rgn = layer.get_pixel_rgn(0, 0, width, height, TRUE, FALSE)
src_pixels = array("B", rgn[0:width, 0:height])
# cmbytes, cmdata = pdb.gimp_image_get_colormap(img)
# colors = cmbytes / 3
# pdb.gimp_message(str(cmdata))
i = 0
ph = 0
for y in range(height):
ph = y & 1
for x in range(width):
c = src_pixels[i]
if (c & 1):
c = c-1 if (ph == 0) else c+1
src_pixels[i] = c
ph = ph ^ 1
i = i + 1
rgn[0:width, 0:height] = src_pixels.tostring()
layer.flush()
# layer.merge_shadow()
layer.update(0,0,width,height)
pdb.gimp_image_undo_group_end(img)
pdb.gimp_message("Finished!")
except Exception, err:
pdb.gimp_message("ERR: " + str(err))
pdb.gimp_image_undo_group_end(img)
register(
"python_fu_dither",
"Dither odd colors in an indexed-color image",
"Dither odd colors in an indexed-color image",
"Andy Hefner",
"Andy Hefner",
"2010",
"
/Filters/Mine/8-Bit Dither Helper",
"INDEXED",
[],
[],
python_8bit_dither)
main()