Some opinionated comments. And hopefully part of an answer.
I would use a drop-down list. I would and not pre-fill it with anything.
I would not Don't accept an empty box, but I would provide a list choice which is "Prefer not to say" but phrased better. :)
Not pre-filling it makes the user at least think about it, so that you don't get the default answer all the time.
I would make Be sure to keep the list short, so that it isn't too much of an effort to answer this.
Most people don't worry about answering registration questions accurately. So unless ethnicity has some major effect on how your app operates, if the question takes too much effort you're likely to get a random click on the first few displayed choices.