There is only one way to add items to a CheckedListBox and that's in code. Even when you add items in the designer, that simply generates the code to add them for you. So, if you want the user to be able to add items then you do it as already explained.

If you want to save data between sessions then that is a different thing altogether, and doesn't really relate to the CheckedListBox specifically. The principle would be the same no matter what the data was and how it was being displayed. Basically, you need to persist the data somewhere before closing and then load it again at startup. That somewhere could be a database, a text file, an XML file, applications settings or various other options.

My first suggestion would be to use application settings. To do that, you can open the Settings page of the project properties and add a StringCollection. You would then add your default items to that. At startup, load the items from that StringCollection into your control. Add new items to the control during the session and, before you shut down, refresh the StringCollection with the contents of the control.

One issue there is that the checked state of the items won't be saved. To handle that you could combine the text and checked state of an item into a single string to store in the setting. You can then parse the data on load to get the two separate values.

Using My.Settings will also use a separate list for each Windows user. That might not matter if only one person uses the machine. It also might be exactly what you want, or it might not be acceptable. In that final case, you'd have to use some other method to persist the data.