Para controlar los tres estados del botón, puedes usar una variable que mantenga el estado, y que ubicarás en un sitio en el que persista entre los clicks. No has dicho qué tipo de aplicación es; si fuera (por ejemplo) webforms, la variable la persistiríamos
en el ViewState. Su poniendo que sea en cambio Winforms, podría ser una variable miembro del Form:
private int estado=0
public void Button1_Click(object sender, EventArgs e)
{
Button b = (Button)sender;
switch (estado)
{
case 0: b.Color=Color.Blue; ++estado; break;
case 1: b.Color=Color.Yellow; ++estado; break;
case 2: b.Color=Color.Red; break;
}
}