Again, on a general note please give your variables word names if possible - makes it so much easier to follow. So "Birthweek.list" rather than "bw.list", etc. Unless there is some horrible reason I'm unaware of that this would not be allowed in C#.
For the actual questions, has it been established anywhere that the two lists correspond? So that in the first birth week listed = the first weight given. I can't see that it does.
Once you've fixed that, why not merge the two foreach commands? so:
//foreach value in bW
foreach (int i in bW)
{
//if value in bW is more than 37 or less than 39
if (i >= 37 && i <= 39)
{
//foreach value in W
foreach (int i1 in W)
{
//MessageBox.Show(i1.ToString());
//Add to Av List
Av.Add(i1);
}
nwa++; //Add one to number weight average
}
}
I think you should be able to do that and save on about ten or so lines of code.
But as to the main problem, I think it might just be that the computer doesn't understand that the two lists are paired up. You might want to look into using something called a Tuple, which can be used to created ordered pairs. Then instead of having the two separate lists 37, 37, 37... and 3791, 3893..., they are merged into one as (37, 3791), (37, 3893) ... That way you could have a code that asks, "if the first number in the ordered pair is 37, 38 or 39, then add the second number to the list of numbers to be averaged."
I think that should work.