The $ is an abbreviation for saying "as String".
The % is an abbreviation for saying "as Integer".
Those abbreviation characters have been around for awhile, here is a general overview of variable types, their abbreviation characters, and their description. The intervening dots are my attempt to enhance readability for the fields on this html page.
Type...............Memory....Character...........Description
Byte...............1 byte....none................Positive whole number ranging from 0 through 255 that can be represented as a binary value.
Boolean............2 bytes...none................True or False value
Integer............2 bytes...%...................Whole numbers ranging from -32,768 through 32,767.
Long...............4 bytes...&...................Whole numbers ranging from -2,147,483,648 through 2,147,483,647.
Single.............4 bytes...!...................Single-precision floating-point number (with decimal points) ranging from -3.402823E38 to 3.402823E38.
Double.............8 bytes...#...................Double-precision floating-point number ranging from -1.79769313486232E308 to 1.79769313486232E308.
Currency...........8 bytes...@...................Large numbers between -922,337,203,685,477.5808 and 922,337,203,685,477.5807.
Date...............8 bytes...none................Represents dates from January 1, 100 through December 31, 9999.
Object.............4 bytes...none................An instance of a class or object reference.
String.............10 bytes + 1 byte per char...$...Series of any ASCII characters.
String (fix len)...length of string..............none...Series of any ASCII characters, of a pre-defined length.
Variant............min 16 bytes..................none...Any kind of data except fixed-length String data and user-defined types.
Regarding your question about creating a list of items programmatically, you can either loop through each item in the range and amass the list that way with literal strings, or you can name the range and refer to the named range as the list source. It's hard for me to be more specific than that without more info from you about what you are really working with. Amassing literal strings for data validation will max out at 255 characters, so if your range of list items is large, I'd name the list, which you can do dynamically with or without code, and refer to the named range in your code.
Post back with specifics on what you have in what worksheet(s), and what you want for data validation in what cell(s), and someone can assist.