As suggested by Kirk Kuykendall, I tried joining my existing feature class with a table created in a InMemoryWorkspaceFactory.
To display symbology, I used a UniqueValue renderer to define symbols based on a field in the generated table.
However, for some reason, the InMemoryWorkspaceFactory didn't do the work, the join operation returned no records (see this post).
To resolve the problem, I kept the same code, but I used a FileGDBScratchWorkspaceFactory to create the table.
Here's the complete code :
// Create a scratch (temporary) workspace factory.
IScratchWorkspaceFactory2Ptr ipWorkspaceFactory(CLSID_FileGDBScratchWorkspaceFactory);
// Create a new scratch (temporary) workspace. This returns a name object.
IWorkspaceNamePtr ipWorkspaceName;
IWorkspacePtr ipWorkspace;
ipWorkspaceFactory->CreateNewScratchWorkspace(&ipWorkspace);
IFeatureWorkspacePtr ipScratchFeatureWorkspace(ipWorkspace);
IFieldsEditPtr ipFieldsEdit(CLSID_Fields);
... Fields creating code...//Créer le array de champs
ITablePtr ipTable;
HRESULT hr4 = ipScratchFeatureWorkspace->CreateTable(L"TemporaryTable",ipFieldsEdit, NULL, NULL, NULL, &ipTable);
... Table populating code ...
//Create a relationship class
IFeatureWorkspacePtr ipFeatureWorkspace(CTools::GetWorkspaceFromFeatureClass(ipFeatureClass));
IObjectClassPtr ipObjectClass(ipTable);
IMemoryRelationshipClassFactoryPtr ipMemoryRelationshipClassFactory(CLSID_MemoryRelationshipClassFactory);
IRelationshipClassPtr ipRelClass;
HRESULT hr = ipMemoryRelationshipClassFactory->Open(L"Join", ipFeatureClass, L"Numero_AD", ipObjectClass, L"NumeroAD", L"forward", L"backward", esriRelCardinalityOneToOne, &ipRelClass);
//Create a relquerytable
IRelQueryTableFactoryPtr ipRelQueryTableFactory(CLSID_RelQueryTableFactory);
IRelQueryTablePtr ipQueryTable;
hr = ipRelQueryTableFactory->Open(ipRelClass, VARIANT_TRUE, NULL, NULL, NULL, VARIANT_TRUE, VARIANT_TRUE,&ipQueryTable);
IGeoFeatureLayerPtr ipNewGeoFeatureLayer(CLSID_FeatureLayer);
IFeatureClassPtr ipFCQueryTable(ipQueryTable);
ipNewGeoFeatureLayer->putref_FeatureClass(ipFCQueryTable);
//Create the renderer
IFeatureRendererPtr ipFeatureRenderer(CLSID_UniqueValueRenderer);
IUniqueValueRendererPtr ipUniqueValueRenderer(ipFeatureRenderer);
ipUniqueValueRenderer->put_FieldCount(1);
ipUniqueValueRenderer->put_Field(0, L"VCConduites.DsplValue");
ipUniqueValueRenderer->put_DefaultLabel(L"Default");
ipUniqueValueRenderer->put_DefaultSymbol(CTools::CreateSymbol(esriGeometryPolyline, 0));
ipUniqueValueRenderer->put_UseDefaultSymbol(VARIANT_TRUE);
ipUniqueValueRenderer->AddValue(L"1", L"1", CTools::CreateSymbol(esriGeometryPolyline, 1));
ipUniqueValueRenderer->AddValue(L"2", L"1", CTools::CreateSymbol(esriGeometryPolyline, 2));
ipUniqueValueRenderer->AddValue(L"3", L"1", CTools::CreateSymbol(esriGeometryPolyline, 3));
ipUniqueValueRenderer->AddValue(L"4", L"1", CTools::CreateSymbol(esriGeometryPolyline, 4));
ipUniqueValueRenderer->AddValue(L"5", L"1", CTools::CreateSymbol(esriGeometryPolyline, 5));
ipNewGeoFeatureLayer->putref_Renderer(ipFeatureRenderer);
ipNewGeoFeatureLayer->put_Name(L"TemporaryLayer");
ipMxDocument->AddLayer(ipNewGeoFeatureLayer);