reader[i]
is an index to the i-th field of the current record. For example, if your query is
SELECT ID, FNAME, LNAME, ADDRESS FROM CUSTOMERS
then your loop tries to pass to your function the field ID (i=0) of the first record at the first loop, the field FNAME (i=1) of the second record in the second loop, the field LNAME (i=2) of the third record in the third loop and then the field ADDRESS (i=3) of the fourth record, finally (if you have more than four records retrieved) the code crashes with an out of range exception (i=4 but the columns are just 4)
You need to build an object Response
and then fill its properties before adding it to the list.
So, still supposing that your object Response has four properties named ID, FirstName, LastName, Address
then you write
List<Response> responseList = new List<Response>();
while(reader.Read())
{
responseList.Add(new Response()
{
ID = reader[0].ToString(),
FirstName = reader[1].ToString(),
LastName = reader[2].ToString(),
Address = reader[3].ToString()
};
}