What you have checked by default should be based off of the user's most common response.
If it is most common for the user to select all 3, then default to all three checked and handle it the way you described above (I think that seems nice).
If you aren't sure what the most common response will be, you might want to default to having none of them checked, and then in the question above, describe "Please select at least one...(complete with the relevant info for this question/statement)"
Often, such lists are part of a dialog that has an OK or Next> button. This is necessary to indicate that the user has finished making choices.
This button can simply be disabled when no choice is made. This is intuitive enough, even if there is no direct instruction to pick one or more options.
Note that this option fails if you make your dialog more complex, so it's unclear why exactly the Next> button is disabled. This is just an argument in favor of multiple simple steps instead of one complex step.
Your error message is good and will clearly inform the user. But if you can provide a clue about this error at the outset, you'll avoid some user frustration. If this happens more than once in your app, that tiny frustration becomes cumulative.
Start with a notes under the control heading. Something alone the lines of
You should give users the freedom to select but never pre-select the options for the user. You should give full control to the user for all the decisions that he/she wants to make. When you start pre-selecting options for him/her, user feels "not in control" and kind of "being pushed/forced" (even though that's not your intention).
I would go with, 3 unselected checkboxes by default and an instruction to select at least 2 checkboxes. And your form should be validated according to that rule when user only selects one or do not select at all etc.
Can you allow the user to temporarily deselect all 3 checkboxes without breaking your app?
If so I would allow them to do this and then provide the validation message when the last checkbox is deselected. I would rather be allowed to deselect the option I don't want and then select the one I do than the other way round.
If it is some kind of live filter of a list then I would hide all items on the list when there are no checkboxes selected and replace with a further message e.g. "At least one filter option must be selected"
Yep, I agree that one should be selected by default.
----- Additional comment below -----
This really depends on the context and what kind of application it is: what the label is and the options provided. That being said, it is a positive experience to add what matters to the user by allowing her to select her desired option(s), rather than requiring her to remove (de-select) what is not important to the user, which is an unnecessary task from the perspective of the user. And like Lauren commented, the default selection should be based off of the user's most common response, or what is most common or popular among your users.
I didn't think I had to stress the point that the previous answer made, as I agreed with it.
Apologies, I'm just starting to use this app, so still learning the community norms, rules and etiquettes.