¿Cuál es la mejor manera de combinar dos objetos durante el tiempo de ejecución utilizando C #?

Tengo dos objetos y quiero fusionarlos:

public class Foo
{
    public string Name { get; set; }
}

public class Bar
{
    public Guid Id { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }
    public string Property4 { get; set; }
}

Crear:

public class FooBar
{
    public string Name { get; set; }
    public Guid Id { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }
    public string Property4 { get; set; }
}

Solo conoceré la estructura de Foo en tiempo de ejecución. La barra puede ser de cualquier tipo en tiempo de ejecución. Me gustaría tener un método que se le asigne un tipo y que combine ese tipo con Foo. Por ejemplo, en el escenario anterior, el método recibió un tipo de barra en tiempo de ejecución y lo combiné con Foo.

Cuál sería la mejor forma de hacer esto? ¿Se puede hacer usando las expresiones LINQ o tengo que generarlo dinámicamente o hay otra forma? Todavía estoy aprendiendo el nuevo espacio de nombres LINQ en C # 3.0, así que disculpe la ignorancia si no puede hacerse usando las expresiones LINQ. Esta es también la primera vez que tengo que hacer algo dinámico como este con C #, por lo que no estoy muy seguro de todas las opciones que tengo disponibles.

Gracias por las opciones dadas.

EDITAR

Esto es estrictamente para agregar metainformación al tipo que se me dio para la serialización. Este escenario mantiene a los objetos del usuario ignorantes de la metainformación que se debe agregar, antes de que se serialice. He encontrado dos opciones antes de hacer esta pregunta y solo quería ver si había más, antes de decidir cuál usar.

Las dos opciones que he encontrado son:

Manipulando la cadena serializada del tipo que se me dio después de serializarla, agregando la metainformación.

Envolviendo el tipo que se me dio, que es similar a lo que mencionó @Zxpro, pero el mío difirió ligeramente, lo cual está bien. Solo hará que el usuario de mi API tenga que seguir la convención, lo cual no es algo malo, ya que todos tienen que ver con la convención sobre la configuración:

public class Foo<T>
{
    public string Name { get; set; }
    public T Content { get; set; }
}

EDITAR

Gracias a todos por sus respuestas. Decidí envolver el objeto como arriba y le di la respuesta a @Zxpro, ya que a la mayoría también le gustó ese enfoque.

Si alguien más se encuentra con esta pregunta, no dude en publicar, si cree que podría haber una mejor manera.

Respuestas a la pregunta(7)

Su respuesta a la pregunta