Q:

¿cómo convertir un objeto a un string? 

Tengo declaradas unas clases para ordenar los objetos y necesito escribir por cada linea un string como el ejemplo, teniendo en cuenta que el último ; (punto y coma se elimina y también que puede tener todos los valores como no tenerlos) ejemplo:
"1; NIF; 27/11/1985;SHA1; 5646dfb36fb456bd756dc8974"

Todo esto debido a que necesito generar un .csv de diferentes líneas entonces mi idea es hacer un foreach para escribir las diferentes lineas usando varias instancias de las clases que también son diferentes.  El siguiente código es replicable y funciona, pero estoy seguro que existe una manera mucho mas decente de hacerlo. 
* nota no puedo usar librerias. 
namespace Pruebas
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                tipoRegistro16 tr16 = new tipoRegistro16
                {
                    codigo = "1204;",
                    total = "$1.200.000;"
                };
                tipoRegistro161 tr161 = new tipoRegistro161
                {
                    codigo = "0015;",
                    nombre = "PRINTERS SAS;",
                    baseGravable = ";",
                    porcentaje = "19;",
                    valor = "1.200.000;",
                    codigoUnidad = "20;",
                    unidad = "6;",
                    valorPorUnidad = "200.000;"
                };

                Console. WriteLine(tr16.codigo + tr16.total);
                Console. WriteLine(tr161.codigo + tr161.nombre + tr161.baseGravable + tr161.porcentaje + tr161.valor + tr161.codigoUnidad + tr161.unidad + tr161.valorPorUnidad);
                Console. ReadKey();
            }
        }
    }
    public class tipoRegistro16
    {
        public string codigo { get; set; }
        public string total { get; set; }

    }
    public class tipoRegistro161
    {
        public string codigo { get; set; }
        public string nombre { get; set; }
        public string baseGravable { get; set; }
        public string porcentaje { get; set; }
        public string valor { get; set; }
        public string codigoUnidad { get; set; }
        public string unidad { get; set; }
        public string valorPorUnidad { get; set; }

    }

Resultado esperado:
1204;$1.200.000
0015;PRINTERS SAS;;19;1.200.000;20;6;200.000

A:

Si tienes un objeto y la idea es serializar a csv entonces usa una libreria como ser
CsvHelper
de esta forma la clase se exporta directo
List<ipoRegistro11> datos = new List<ipoRegistro11>();
//generas los datos

using (var writer = new StreamWriter("file.csv"))
using (var csv = new CsvWriter(writer))
{
    csv. WriteRecords(datos);
}

Tambien tienes el 
File Helpers
entonces a la clase le define el delimitador
[DelimitedRecord(";")]
class tipoRegistro11
{
    //propiedades
}

y exportas
var engine = new FileHelperEngine<tipoRegistro11>();

//aqui creas los datos
List<ipoRegistro11> datos = new List<ipoRegistro11>();

engine. WriteFile("Output.csv", datos);

como veras queda muy simple el codigo usando librerias

Sino puedes usar librerias entonces podrias generar lineas con el string. Join() y al final lo grabas en el archivo con File. WriteAllLines()
protected void lbtnGenerar_Click(object sender, EventArgs e)
{
    List<tipoRegistro11> datos = new List<tipoRegistro11>();

    for(...)
    {
        // aqui generas los datos
        datos. Add(item);
    }

    List<string> lineas = new List<string>();
    foreach(var item in datos)
    {
        string[] temp = new string[] { tr11.id, tr11.tipo, tr11.fecha. ToString(), ... };
        string linea = string. Join(";", temp);

        lineas. Add(linea);
    }

    File. WriteAllLines("archivo.csv", lineas);

 }

