So really you are trying to limit what values the stages can have. You are attempting to do it with inList and strings, however the object is not a String, it is a Stage.
So on the Stage domain, I would create a method like:
static List<Stage> projectStages() {
Stage.findAllByNameInList(["Not started", "Critically Late", "Off Target Date", "On target"])
}
Then in your validation:
requirements inList: Stage.projectStages()
I don't think I've ever tried to call a static method from a default validator, so if that doesn't work:
requirements validator { val, obj -> Stage.projectStages().contains(val) }