you make a shallow copy of the list. When list1 destroys an element list2 will still reference it and will probably crash later. So no it's not corrrect.
You need to create a new ListNode for each element in aList
This is a constructor. That means that head and size contain garbage on entry and must be initialized. Line 7 and 10 assume that they contain something valid.
Generally the code looks pretty good. I do have a couple of comments, though:
Line 7 is a memory leak. You have allocated pNewNode, and then, if your index is out of range, you return without deleting it.
The last element in the list has next = NULL. There is no harm reassigning the this value in pNewNode if it happens to be inserted at the end of the list. So, you can completely get rid of lines 27 - 39.
Edit: Oh yeah. Why return an int? A bool indicating success or failure might be cleaner.