Как в C# реализовать изменение свойств нескольких компонентов в чужом потоке?
Я не уверен, что правильно понял ваш вопрос, но попробую предположить, что вы считаете, что Invoke должен вызываться у того контрола, действия с которым вы хотите совершить. Это не так - вы можете вызвать Invoke на любом контроле, который работает в том UI-потоке, контролы в котором вы хотите изменить.
Т.е. вы можете делать так:private void AddTag(bool onstart)
{
    if (tagList.InvokeRequired)
        tagList.Invoke(new Action(() => BlockUI(onstart)));
    else
        BlockUI(onstart);
}
Вместо tagList может быть любой контрол, работающий в этом UI-потоке. Например, пусть у вас на форме три кнопки:private void button1_Click(object sender, System.EventArgs e)
{
	var t = new Thread(new ThreadStart(() =>
	{
		if (button3.InvokeRequired)
		{
			button3.Invoke(new Action(() =>
			{
				button1.Text = "new button1 name";
				button2.Text = "new button2 name";
				button3.Text = "new button3 name";
			}));
		}
		else
		{
			button1.Text = "new button1 name";
			button2.Text = "new button2 name";
			button3.Text = "new button3 name";
		}                
	}));
	t.Start();
}
Кстати, форма тоже является контролом, так что в этом примере можно писать и так:private void button1_Click(object sender, System.EventArgs e)
{
	var t = new Thread(new ThreadStart(() =>
	{
		if (InvokeRequired)
		{
			Invoke(new Action(() =>
			{
				button1.Text = "new button1 name";
				button2.Text = "new button2 name";
				button3.Text = "new button3 name";
			}));
		}
		else
		{
			button1.Text = "new button1 name";
			button2.Text = "new button2 name";
			button3.Text = "new button3 name";
		}                
	}));
	t.Start();
}
На самом деле все проще, надо использовать genereic метод. Пример www.codeproject.com/Articles/37413/A-Generic-Metho...